home *** CD-ROM | disk | FTP | other *** search
/ Champak 141 / (Vol 141) Oct 17 2011.iso / Games / guitar-geek.swf / scripts / MochiAd.as < prev    next >
Encoding:
Text File  |  2011-10-17  |  30.7 KB  |  952 lines

  1. package
  2. {
  3.    import flash.display.DisplayObjectContainer;
  4.    import flash.display.Loader;
  5.    import flash.display.MovieClip;
  6.    import flash.events.Event;
  7.    import flash.net.LocalConnection;
  8.    import flash.net.URLRequest;
  9.    import flash.net.URLRequestMethod;
  10.    import flash.net.URLVariables;
  11.    import flash.system.Security;
  12.    import flash.utils.getTimer;
  13.    import flash.utils.setTimeout;
  14.    
  15.    public class MochiAd
  16.    {
  17.        
  18.       
  19.       public function MochiAd()
  20.       {
  21.          super();
  22.       }
  23.       
  24.       public static function getVersion() : String
  25.       {
  26.          return "2.6";
  27.       }
  28.       
  29.       public static function showClickAwayAd(options:Object) : void
  30.       {
  31.          var h:Number;
  32.          var wh:Array;
  33.          var w:Number;
  34.          var sendHostProgress:Boolean;
  35.          var clip:Object = null;
  36.          var mc:MovieClip = null;
  37.          var chk:MovieClip = null;
  38.          var DEFAULTS:Object = {
  39.             "ad_timeout":2000,
  40.             "regpt":"o",
  41.             "method":"showClickAwayAd",
  42.             "res":"300x250",
  43.             "no_bg":true,
  44.             "ad_started":function():void
  45.             {
  46.             },
  47.             "ad_finished":function():void
  48.             {
  49.             },
  50.             "ad_loaded":function(width:Number, height:Number):void
  51.             {
  52.             },
  53.             "ad_failed":function():void
  54.             {
  55.                trace("[MochiAd] Couldn\'t load an ad, make sure your game\'s local security sandbox is configured for Access Network Only and that you are not using ad blocking software");
  56.             },
  57.             "ad_skipped":function():void
  58.             {
  59.             }
  60.          };
  61.          options = MochiAd._parseOptions(options,DEFAULTS);
  62.          clip = options.clip;
  63.          var ad_timeout:Number = Number(options.ad_timeout);
  64.          delete options.ad_timeout;
  65.          if(!MochiAd.load(options))
  66.          {
  67.             options.ad_failed();
  68.             options.ad_finished();
  69.             return;
  70.          }
  71.          options.ad_started();
  72.          mc = clip._mochiad;
  73.          mc["onUnload"] = function():void
  74.          {
  75.             MochiAd._cleanup(mc);
  76.             options.ad_finished();
  77.          };
  78.          wh = MochiAd._getRes(options,clip);
  79.          w = Number(wh[0]);
  80.          h = Number(wh[1]);
  81.          mc.x = w * 0.5;
  82.          mc.y = h * 0.5;
  83.          chk = createEmptyMovieClip(mc,"_mochiad_wait",3);
  84.          chk.ad_timeout = ad_timeout;
  85.          chk.started = getTimer();
  86.          chk.showing = false;
  87.          mc.unloadAd = function():void
  88.          {
  89.             MochiAd.unload(clip);
  90.          };
  91.          mc.adLoaded = options.ad_loaded;
  92.          mc.adSkipped = options.ad_skipped;
  93.          mc.rpc = function(callbackID:Number, arg:Object):void
  94.          {
  95.             MochiAd.rpc(clip,callbackID,arg);
  96.          };
  97.          sendHostProgress = false;
  98.          mc.regContLC = function(lc_name:String):void
  99.          {
  100.             mc._containerLCName = lc_name;
  101.          };
  102.          chk["onEnterFrame"] = function():void
  103.          {
  104.             var total:Number = NaN;
  105.             if(!this.parent)
  106.             {
  107.                delete this.onEnterFrame;
  108.                return;
  109.             }
  110.             var ad_clip:Object = this.parent._mochiad_ctr;
  111.             var elapsed:Number = getTimer() - this.started;
  112.             var finished:Boolean = false;
  113.             if(!chk.showing)
  114.             {
  115.                total = Number(this.parent._mochiad_ctr.contentLoaderInfo.bytesTotal);
  116.                if(total > 0)
  117.                {
  118.                   chk.showing = true;
  119.                   finished = true;
  120.                   chk.started = getTimer();
  121.                }
  122.                else if(elapsed > chk.ad_timeout)
  123.                {
  124.                   options.ad_failed();
  125.                   finished = true;
  126.                }
  127.             }
  128.             if(this.root == null)
  129.             {
  130.                finished = true;
  131.             }
  132.             if(finished)
  133.             {
  134.                delete this.onEnterFrame;
  135.             }
  136.          };
  137.          doOnEnterFrame(chk);
  138.       }
  139.       
  140.       public static function _isNetworkAvailable() : Boolean
  141.       {
  142.          return Security.sandboxType != "localWithFile";
  143.       }
  144.       
  145.       public static function _allowDomains(server:String) : String
  146.       {
  147.          var hostname:String = String(server.split("/")[2].split(":")[0]);
  148.          Security.allowDomain("*");
  149.          Security.allowDomain(hostname);
  150.          Security.allowInsecureDomain("*");
  151.          Security.allowInsecureDomain(hostname);
  152.          return hostname;
  153.       }
  154.       
  155.       public static function unload(clip:Object) : Boolean
  156.       {
  157.          if(Boolean(clip.clip) && Boolean(clip.clip._mochiad))
  158.          {
  159.             clip = clip.clip;
  160.          }
  161.          if(clip.origFrameRate != undefined)
  162.          {
  163.             clip.stage.frameRate = clip.origFrameRate;
  164.          }
  165.          if(!clip._mochiad)
  166.          {
  167.             return false;
  168.          }
  169.          if(clip._mochiad._containerLCName != undefined)
  170.          {
  171.             clip._mochiad.lc.send(clip._mochiad._containerLCName,"notify",{"id":"unload"});
  172.          }
  173.          if(clip._mochiad.onUnload)
  174.          {
  175.             clip._mochiad.onUnload();
  176.          }
  177.          delete clip._mochiad_loaded;
  178.          delete clip._mochiad;
  179.          return true;
  180.       }
  181.       
  182.       public static function showInterLevelAd(options:Object) : void
  183.       {
  184.          var h:Number;
  185.          var wh:Array;
  186.          var w:Number;
  187.          var fadeout_time:Number;
  188.          var clip:Object = null;
  189.          var mc:MovieClip = null;
  190.          var chk:MovieClip = null;
  191.          var DEFAULTS:Object = {
  192.             "ad_timeout":2000,
  193.             "fadeout_time":250,
  194.             "regpt":"o",
  195.             "method":"showTimedAd",
  196.             "ad_started":function():void
  197.             {
  198.                if(this.clip is MovieClip)
  199.                {
  200.                   this.clip.stop();
  201.                   return;
  202.                }
  203.                throw new Error("MochiAd.showInterLevelAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip.  If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers.");
  204.             },
  205.             "ad_finished":function():void
  206.             {
  207.                if(this.clip is MovieClip)
  208.                {
  209.                   this.clip.play();
  210.                   return;
  211.                }
  212.                throw new Error("MochiAd.showInterLevelAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip.  If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers.");
  213.             },
  214.             "ad_loaded":function(width:Number, height:Number):void
  215.             {
  216.             },
  217.             "ad_failed":function():void
  218.             {
  219.                trace("[MochiAd] Couldn\'t load an ad, make sure your game\'s local security sandbox is configured for Access Network Only and that you are not using ad blocking software");
  220.             },
  221.             "ad_skipped":function():void
  222.             {
  223.             }
  224.          };
  225.          options = MochiAd._parseOptions(options,DEFAULTS);
  226.          clip = options.clip;
  227.          var ad_msec:Number = 11000;
  228.          var ad_timeout:Number = Number(options.ad_timeout);
  229.          delete options.ad_timeout;
  230.          fadeout_time = Number(options.fadeout_time);
  231.          delete options.fadeout_time;
  232.          if(!MochiAd.load(options))
  233.          {
  234.             options.ad_failed();
  235.             options.ad_finished();
  236.             return;
  237.          }
  238.          options.ad_started();
  239.          mc = clip._mochiad;
  240.          mc["onUnload"] = function():void
  241.          {
  242.             MochiAd._cleanup(mc);
  243.             options.ad_finished();
  244.          };
  245.          wh = MochiAd._getRes(options,clip);
  246.          w = Number(wh[0]);
  247.          h = Number(wh[1]);
  248.          mc.x = w * 0.5;
  249.          mc.y = h * 0.5;
  250.          chk = createEmptyMovieClip(mc,"_mochiad_wait",3);
  251.          chk.ad_msec = ad_msec;
  252.          chk.ad_timeout = ad_timeout;
  253.          chk.started = getTimer();
  254.          chk.showing = false;
  255.          chk.fadeout_time = fadeout_time;
  256.          chk.fadeFunction = function():void
  257.          {
  258.             if(!this.parent)
  259.             {
  260.                delete this.onEnterFrame;
  261.                delete this.fadeFunction;
  262.                return;
  263.             }
  264.             var p:Number = 100 * (1 - (getTimer() - this.fadeout_start) / this.fadeout_time);
  265.             if(p > 0)
  266.             {
  267.                this.parent.alpha = p * 0.01;
  268.             }
  269.             else
  270.             {
  271.                MochiAd.unload(clip);
  272.                delete this["onEnterFrame"];
  273.             }
  274.          };
  275.          mc.unloadAd = function():void
  276.          {
  277.             MochiAd.unload(clip);
  278.          };
  279.          mc.adLoaded = options.ad_loaded;
  280.          mc.adSkipped = options.ad_skipped;
  281.          mc.adjustProgress = function(msec:Number):void
  282.          {
  283.             var _chk:Object = mc._mochiad_wait;
  284.             _chk.server_control = true;
  285.             _chk.showing = true;
  286.             _chk.started = getTimer();
  287.             _chk.ad_msec = msec - 250;
  288.          };
  289.          mc.rpc = function(callbackID:Number, arg:Object):void
  290.          {
  291.             MochiAd.rpc(clip,callbackID,arg);
  292.          };
  293.          chk["onEnterFrame"] = function():void
  294.          {
  295.             var total:Number = NaN;
  296.             if(!this.parent)
  297.             {
  298.                delete this.onEnterFrame;
  299.                delete this.fadeFunction;
  300.                return;
  301.             }
  302.             var ad_clip:Object = this.parent._mochiad_ctr;
  303.             var elapsed:Number = getTimer() - this.started;
  304.             var finished:Boolean = false;
  305.             if(!chk.showing)
  306.             {
  307.                total = Number(this.parent._mochiad_ctr.contentLoaderInfo.bytesTotal);
  308.                if(total > 0)
  309.                {
  310.                   chk.showing = true;
  311.                   chk.started = getTimer();
  312.                   MochiAd.adShowing(clip);
  313.                }
  314.                else if(elapsed > chk.ad_timeout)
  315.                {
  316.                   options.ad_failed();
  317.                   finished = true;
  318.                }
  319.             }
  320.             if(elapsed > chk.ad_msec)
  321.             {
  322.                finished = true;
  323.             }
  324.             if(finished)
  325.             {
  326.                if(this.server_control)
  327.                {
  328.                   delete this.onEnterFrame;
  329.                }
  330.                else
  331.                {
  332.                   this.fadeout_start = getTimer();
  333.                   this.onEnterFrame = this.fadeFunction;
  334.                }
  335.             }
  336.          };
  337.          doOnEnterFrame(chk);
  338.       }
  339.       
  340.       public static function _parseOptions(options:Object, defaults:Object) : Object
  341.       {
  342.          var k:String = null;
  343.          var pairs:Array = null;
  344.          var i:Number = NaN;
  345.          var kv:Array = null;
  346.          var optcopy:Object = {};
  347.          for(k in defaults)
  348.          {
  349.             optcopy[k] = defaults[k];
  350.          }
  351.          if(options)
  352.          {
  353.             for(k in options)
  354.             {
  355.                optcopy[k] = options[k];
  356.             }
  357.          }
  358.          if(optcopy.clip == undefined)
  359.          {
  360.             throw new Error("MochiAd is missing the \'clip\' parameter.  This should be a MovieClip, Sprite or an instance of a class that extends MovieClip or Sprite.");
  361.          }
  362.          options = optcopy.clip.loaderInfo.parameters.mochiad_options;
  363.          if(options)
  364.          {
  365.             pairs = options.split("&");
  366.             for(i = 0; i < pairs.length; i++)
  367.             {
  368.                kv = pairs[i].split("=");
  369.                optcopy[unescape(kv[0])] = unescape(kv[1]);
  370.             }
  371.          }
  372.          if(optcopy.id == "test")
  373.          {
  374.             trace("[MochiAd] WARNING: Using the MochiAds test identifier, make sure to use the code from your dashboard, not this example!");
  375.          }
  376.          return optcopy;
  377.       }
  378.       
  379.       public static function _cleanup(mc:Object) : void
  380.       {
  381.          var idx:Number;
  382.          var k:String = null;
  383.          var lc:LocalConnection = null;
  384.          var f:Function = null;
  385.          if("lc" in mc)
  386.          {
  387.             lc = mc.lc;
  388.             f = function():void
  389.             {
  390.                try
  391.                {
  392.                   lc.client = null;
  393.                   lc.close();
  394.                }
  395.                catch(e:Error)
  396.                {
  397.                }
  398.             };
  399.             setTimeout(f,0);
  400.          }
  401.          idx = DisplayObjectContainer(mc).numChildren;
  402.          while(idx > 0)
  403.          {
  404.             idx--;
  405.             DisplayObjectContainer(mc).removeChildAt(idx);
  406.          }
  407.          for(k in mc)
  408.          {
  409.             delete mc[k];
  410.          }
  411.       }
  412.       
  413.       public static function load(options:Object) : MovieClip
  414.       {
  415.          var depth:Number;
  416.          var lv:URLVariables;
  417.          var wh:Array;
  418.          var mc:MovieClip;
  419.          var clip:Object = null;
  420.          var k:String = null;
  421.          var server:String = null;
  422.          var hostname:String = null;
  423.          var lc:LocalConnection = null;
  424.          var name:String = null;
  425.          var loader:Loader = null;
  426.          var g:Function = null;
  427.          var req:URLRequest = null;
  428.          var v:Object = null;
  429.          var DEFAULTS:Object = {
  430.             "server":"http://x.mochiads.com/srv/1/",
  431.             "method":"load",
  432.             "depth":10333,
  433.             "id":"_UNKNOWN_"
  434.          };
  435.          options = MochiAd._parseOptions(options,DEFAULTS);
  436.          options.swfv = 9;
  437.          options.mav = MochiAd.getVersion();
  438.          clip = options.clip;
  439.          if(!MochiAd._isNetworkAvailable())
  440.          {
  441.             return null;
  442.          }
  443.          try
  444.          {
  445.             if(clip._mochiad_loaded)
  446.             {
  447.                return null;
  448.             }
  449.          }
  450.          catch(e:Error)
  451.          {
  452.             throw new Error("MochiAd requires a clip that is an instance of a dynamic class.  If your class extends Sprite or MovieClip, you must make it dynamic.");
  453.          }
  454.          depth = Number(options.depth);
  455.          delete options.depth;
  456.          mc = createEmptyMovieClip(clip,"_mochiad",depth);
  457.          wh = MochiAd._getRes(options,clip);
  458.          options.res = wh[0] + "x" + wh[1];
  459.          options.server += options.id;
  460.          delete options.id;
  461.          clip._mochiad_loaded = true;
  462.          if(clip.loaderInfo.loaderURL.indexOf("http") == 0)
  463.          {
  464.             options.as3_swf = clip.loaderInfo.loaderURL;
  465.          }
  466.          lv = new URLVariables();
  467.          for(k in options)
  468.          {
  469.             v = options[k];
  470.             if(!(v is Function))
  471.             {
  472.                lv[k] = v;
  473.             }
  474.          }
  475.          server = String(lv.server);
  476.          delete lv.server;
  477.          hostname = _allowDomains(server);
  478.          lc = new LocalConnection();
  479.          lc.client = mc;
  480.          name = ["",Math.floor(new Date().getTime()),Math.floor(Math.random() * 999999)].join("_");
  481.          lc.allowDomain("*","localhost");
  482.          lc.allowInsecureDomain("*","localhost");
  483.          lc.connect(name);
  484.          mc.lc = lc;
  485.          mc.lcName = name;
  486.          lv.lc = name;
  487.          lv.st = getTimer();
  488.          loader = new Loader();
  489.          g = function(ev:Object):void
  490.          {
  491.             ev.target.removeEventListener(ev.type,arguments.callee);
  492.             MochiAd.unload(clip);
  493.          };
  494.          loader.contentLoaderInfo.addEventListener(Event.UNLOAD,g);
  495.          req = new URLRequest(server + ".swf");
  496.          req.contentType = "application/x-www-form-urlencoded";
  497.          req.method = URLRequestMethod.POST;
  498.          req.data = lv;
  499.          loader.load(req);
  500.          mc.addChild(loader);
  501.          mc._mochiad_ctr = loader;
  502.          return mc;
  503.       }
  504.       
  505.       public static function runMethod(base:Object, methodName:String, argsArray:Array) : Object
  506.       {
  507.          var nameArray:Array = methodName.split(".");
  508.          for(var i:Number = 0; i < nameArray.length - 1; i++)
  509.          {
  510.             if(base[nameArray[i]] == undefined || base[nameArray[i]] == null)
  511.             {
  512.                return undefined;
  513.             }
  514.             base = base[nameArray[i]];
  515.          }
  516.          if(typeof base[nameArray[i]] == "function")
  517.          {
  518.             return base[nameArray[i]].apply(base,argsArray);
  519.          }
  520.          return undefined;
  521.       }
  522.       
  523.       public static function createEmptyMovieClip(parent:Object, name:String, depth:Number) : MovieClip
  524.       {
  525.          var mc:MovieClip = new MovieClip();
  526.          if(false && Boolean(depth))
  527.          {
  528.             parent.addChildAt(mc,depth);
  529.          }
  530.          else
  531.          {
  532.             parent.addChild(mc);
  533.          }
  534.          parent[name] = mc;
  535.          mc["_name"] = name;
  536.          return mc;
  537.       }
  538.       
  539.       public static function _getRes(options:Object, clip:Object) : Array
  540.       {
  541.          var xy:Array = null;
  542.          var b:Object = clip.getBounds(clip.root);
  543.          var w:Number = 0;
  544.          var h:Number = 0;
  545.          if(typeof options.res != "undefined")
  546.          {
  547.             xy = options.res.split("x");
  548.             w = parseFloat(xy[0]);
  549.             h = parseFloat(xy[1]);
  550.          }
  551.          else
  552.          {
  553.             w = b.xMax - b.xMin;
  554.             h = b.yMax - b.yMin;
  555.          }
  556.          if(w == 0 || h == 0)
  557.          {
  558.             w = Number(clip.stage.stageWidth);
  559.             h = Number(clip.stage.stageHeight);
  560.          }
  561.          return [w,h];
  562.       }
  563.       
  564.       public static function adShowing(mc:Object) : void
  565.       {
  566.          mc.origFrameRate = mc.stage.frameRate;
  567.          mc.stage.frameRate = 30;
  568.       }
  569.       
  570.       public static function getValue(base:Object, objectName:String) : Object
  571.       {
  572.          var nameArray:Array = objectName.split(".");
  573.          for(var i:Number = 0; i < nameArray.length - 1; i++)
  574.          {
  575.             if(base[nameArray[i]] == undefined || base[nameArray[i]] == null)
  576.             {
  577.                return undefined;
  578.             }
  579.             base = base[nameArray[i]];
  580.          }
  581.          return base[nameArray[i]];
  582.       }
  583.       
  584.       public static function rpc(clip:Object, callbackID:Number, arg:Object) : void
  585.       {
  586.          var val:Object = null;
  587.          var ret:Object = null;
  588.          switch(arg.id)
  589.          {
  590.             case "setValue":
  591.                MochiAd.setValue(clip,arg.objectName,arg.value);
  592.                break;
  593.             case "getValue":
  594.                val = MochiAd.getValue(clip,arg.objectName);
  595.                clip._mochiad.lc.send(clip._mochiad._containerLCName,"rpcResult",callbackID,val);
  596.                break;
  597.             case "runMethod":
  598.                ret = MochiAd.runMethod(clip,arg.method,arg.args);
  599.                clip._mochiad.lc.send(clip._mochiad._containerLCName,"rpcResult",callbackID,ret);
  600.                break;
  601.             default:
  602.                trace("[mochiads rpc] unknown rpc id: " + arg.id);
  603.          }
  604.       }
  605.       
  606.       public static function setValue(base:Object, objectName:String, value:Object) : void
  607.       {
  608.          var nameArray:Array = objectName.split(".");
  609.          for(var i:Number = 0; i < nameArray.length - 1; i++)
  610.          {
  611.             if(base[nameArray[i]] == undefined || base[nameArray[i]] == null)
  612.             {
  613.                return;
  614.             }
  615.             base = base[nameArray[i]];
  616.          }
  617.          base[nameArray[i]] = value;
  618.       }
  619.       
  620.       public static function showPreGameAd(options:Object) : void
  621.       {
  622.          var bar:MovieClip;
  623.          var fadeout_time:Number;
  624.          var backing:Object;
  625.          var bar_outline:Number;
  626.          var outline_mc:MovieClip;
  627.          var bar_color:Number;
  628.          var inside_mc:MovieClip;
  629.          var backing_mc:MovieClip;
  630.          var outline:Object;
  631.          var ad_timeout:Number;
  632.          var wh:Array;
  633.          var bar_background:Number;
  634.          var ad_msec:Number;
  635.          var h:Number;
  636.          var f:Function;
  637.          var w:Number;
  638.          var inside:Object;
  639.          var clip:Object = null;
  640.          var mc:MovieClip = null;
  641.          var chk:MovieClip = null;
  642.          var complete:Boolean = false;
  643.          var unloaded:Boolean = false;
  644.          var sendHostProgress:Boolean = false;
  645.          var fn:Function = null;
  646.          var r:MovieClip = null;
  647.          var DEFAULTS:Object = {
  648.             "ad_timeout":3000,
  649.             "fadeout_time":250,
  650.             "regpt":"o",
  651.             "method":"showPreloaderAd",
  652.             "color":16747008,
  653.             "background":16777161,
  654.             "outline":13994812,
  655.             "no_progress_bar":false,
  656.             "ad_started":function():void
  657.             {
  658.                if(this.clip is MovieClip)
  659.                {
  660.                   this.clip.stop();
  661.                   return;
  662.                }
  663.                throw new Error("MochiAd.showPreGameAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip.  If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers.");
  664.             },
  665.             "ad_finished":function():void
  666.             {
  667.                if(this.clip is MovieClip)
  668.                {
  669.                   this.clip.play();
  670.                   return;
  671.                }
  672.                throw new Error("MochiAd.showPreGameAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip.  If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers.");
  673.             },
  674.             "ad_loaded":function(width:Number, height:Number):void
  675.             {
  676.             },
  677.             "ad_failed":function():void
  678.             {
  679.                trace("[MochiAd] Couldn\'t load an ad, make sure your game\'s local security sandbox is configured for Access Network Only and that you are not using ad blocking software");
  680.             },
  681.             "ad_skipped":function():void
  682.             {
  683.             },
  684.             "ad_progress":function(percent:Number):void
  685.             {
  686.             }
  687.          };
  688.          options = MochiAd._parseOptions(options,DEFAULTS);
  689.          if("c862232051e0a94e1c3609b3916ddb17".substr(0) == "dfeada81ac97cde83665f81c12da7def")
  690.          {
  691.             options.ad_started();
  692.             fn = function():void
  693.             {
  694.                options.ad_finished();
  695.             };
  696.             setTimeout(fn,100);
  697.             return;
  698.          }
  699.          clip = options.clip;
  700.          ad_msec = 11000;
  701.          ad_timeout = Number(options.ad_timeout);
  702.          delete options.ad_timeout;
  703.          fadeout_time = Number(options.fadeout_time);
  704.          delete options.fadeout_time;
  705.          if(!MochiAd.load(options))
  706.          {
  707.             options.ad_failed();
  708.             options.ad_finished();
  709.             return;
  710.          }
  711.          options.ad_started();
  712.          mc = clip._mochiad;
  713.          mc["onUnload"] = function():void
  714.          {
  715.             var fn:Function;
  716.             MochiAd._cleanup(mc);
  717.             fn = function():void
  718.             {
  719.                options.ad_finished();
  720.             };
  721.             setTimeout(fn,100);
  722.          };
  723.          wh = MochiAd._getRes(options,clip);
  724.          w = Number(wh[0]);
  725.          h = Number(wh[1]);
  726.          mc.x = w * 0.5;
  727.          mc.y = h * 0.5;
  728.          chk = createEmptyMovieClip(mc,"_mochiad_wait",3);
  729.          chk.x = w * -0.5;
  730.          chk.y = h * -0.5;
  731.          bar = createEmptyMovieClip(chk,"_mochiad_bar",4);
  732.          if(options.no_progress_bar)
  733.          {
  734.             bar.visible = false;
  735.             delete options.no_progress_bar;
  736.          }
  737.          else
  738.          {
  739.             bar.x = 10;
  740.             bar.y = h - 20;
  741.          }
  742.          bar_color = Number(options.color);
  743.          delete options.color;
  744.          bar_background = Number(options.background);
  745.          delete options.background;
  746.          bar_outline = Number(options.outline);
  747.          delete options.outline;
  748.          backing_mc = createEmptyMovieClip(bar,"_outline",1);
  749.          backing = backing_mc.graphics;
  750.          backing.beginFill(bar_background);
  751.          backing.moveTo(0,0);
  752.          backing.lineTo(w - 20,0);
  753.          backing.lineTo(w - 20,10);
  754.          backing.lineTo(0,10);
  755.          backing.lineTo(0,0);
  756.          backing.endFill();
  757.          inside_mc = createEmptyMovieClip(bar,"_inside",2);
  758.          inside = inside_mc.graphics;
  759.          inside.beginFill(bar_color);
  760.          inside.moveTo(0,0);
  761.          inside.lineTo(w - 20,0);
  762.          inside.lineTo(w - 20,10);
  763.          inside.lineTo(0,10);
  764.          inside.lineTo(0,0);
  765.          inside.endFill();
  766.          inside_mc.scaleX = 0;
  767.          outline_mc = createEmptyMovieClip(bar,"_outline",3);
  768.          outline = outline_mc.graphics;
  769.          outline.lineStyle(0,bar_outline,100);
  770.          outline.moveTo(0,0);
  771.          outline.lineTo(w - 20,0);
  772.          outline.lineTo(w - 20,10);
  773.          outline.lineTo(0,10);
  774.          outline.lineTo(0,0);
  775.          chk.ad_msec = ad_msec;
  776.          chk.ad_timeout = ad_timeout;
  777.          chk.started = getTimer();
  778.          chk.showing = false;
  779.          chk.last_pcnt = 0;
  780.          chk.fadeout_time = fadeout_time;
  781.          chk.fadeFunction = function():void
  782.          {
  783.             var p:Number = 100 * (1 - (getTimer() - this.fadeout_start) / this.fadeout_time);
  784.             if(p > 0)
  785.             {
  786.                this.parent.alpha = p * 0.01;
  787.             }
  788.             else
  789.             {
  790.                MochiAd.unload(clip);
  791.                delete this["onEnterFrame"];
  792.             }
  793.          };
  794.          complete = false;
  795.          unloaded = false;
  796.          f = function(ev:Event):void
  797.          {
  798.             ev.target.removeEventListener(ev.type,arguments.callee);
  799.             complete = true;
  800.             if(unloaded)
  801.             {
  802.                MochiAd.unload(clip);
  803.             }
  804.          };
  805.          clip.loaderInfo.addEventListener(Event.COMPLETE,f);
  806.          if(clip.root is MovieClip)
  807.          {
  808.             r = clip.root as MovieClip;
  809.             if(r.framesLoaded >= r.totalFrames)
  810.             {
  811.                complete = true;
  812.             }
  813.          }
  814.          mc.unloadAd = function():void
  815.          {
  816.             unloaded = true;
  817.             if(complete)
  818.             {
  819.                MochiAd.unload(clip);
  820.             }
  821.          };
  822.          mc.adLoaded = options.ad_loaded;
  823.          mc.adSkipped = options.ad_skipped;
  824.          mc.adjustProgress = function(msec:Number):void
  825.          {
  826.             var _chk:Object = mc._mochiad_wait;
  827.             _chk.server_control = true;
  828.             _chk.showing = true;
  829.             _chk.started = getTimer();
  830.             _chk.ad_msec = msec;
  831.          };
  832.          mc.rpc = function(callbackID:Number, arg:Object):void
  833.          {
  834.             MochiAd.rpc(clip,callbackID,arg);
  835.          };
  836.          mc.rpcTestFn = function(s:String):Object
  837.          {
  838.             trace("[MOCHIAD rpcTestFn] " + s);
  839.             return s;
  840.          };
  841.          mc.regContLC = function(lc_name:String):void
  842.          {
  843.             mc._containerLCName = lc_name;
  844.          };
  845.          sendHostProgress = false;
  846.          mc.sendHostLoadProgress = function(lc_name:String):void
  847.          {
  848.             sendHostProgress = true;
  849.          };
  850.          chk["onEnterFrame"] = function():void
  851.          {
  852.             var total:Number = NaN;
  853.             if(!this.parent || !this.parent.parent)
  854.             {
  855.                delete this["onEnterFrame"];
  856.                return;
  857.             }
  858.             var _clip:Object = this.parent.parent.root;
  859.             var ad_clip:Object = this.parent._mochiad_ctr;
  860.             var elapsed:Number = getTimer() - this.started;
  861.             var finished:Boolean = false;
  862.             var clip_total:Number = Number(_clip.loaderInfo.bytesTotal);
  863.             var clip_loaded:Number = Number(_clip.loaderInfo.bytesLoaded);
  864.             if(complete)
  865.             {
  866.                clip_loaded = Math.max(1,clip_loaded);
  867.                clip_total = clip_loaded;
  868.             }
  869.             var clip_pcnt:Number = 100 * clip_loaded / clip_total;
  870.             var ad_pcnt:Number = 100 * elapsed / chk.ad_msec;
  871.             var _inside:Object = this._mochiad_bar._inside;
  872.             var pcnt:Number = Math.min(100,Math.min(clip_pcnt || 0,ad_pcnt));
  873.             pcnt = Math.max(this.last_pcnt,pcnt);
  874.             this.last_pcnt = pcnt;
  875.             _inside.scaleX = pcnt * 0.01;
  876.             options.ad_progress(pcnt);
  877.             if(sendHostProgress)
  878.             {
  879.                clip._mochiad.lc.send(clip._mochiad._containerLCName,"notify",{
  880.                   "id":"hostLoadPcnt",
  881.                   "pcnt":clip_pcnt
  882.                });
  883.                if(clip_pcnt == 100)
  884.                {
  885.                   sendHostProgress = false;
  886.                }
  887.             }
  888.             if(!chk.showing)
  889.             {
  890.                total = Number(this.parent._mochiad_ctr.contentLoaderInfo.bytesTotal);
  891.                if(total > 0)
  892.                {
  893.                   chk.showing = true;
  894.                   chk.started = getTimer();
  895.                   MochiAd.adShowing(clip);
  896.                }
  897.                else if(elapsed > chk.ad_timeout && clip_pcnt == 100)
  898.                {
  899.                   options.ad_failed();
  900.                   finished = true;
  901.                }
  902.             }
  903.             if(elapsed > chk.ad_msec)
  904.             {
  905.                finished = true;
  906.             }
  907.             if(complete && finished)
  908.             {
  909.                if(this.server_control)
  910.                {
  911.                   delete this.onEnterFrame;
  912.                }
  913.                else
  914.                {
  915.                   this.fadeout_start = getTimer();
  916.                   this.onEnterFrame = chk.fadeFunction;
  917.                }
  918.             }
  919.          };
  920.          doOnEnterFrame(chk);
  921.       }
  922.       
  923.       public static function showPreloaderAd(options:Object) : void
  924.       {
  925.          trace("[MochiAd] DEPRECATED: showPreloaderAd was renamed to showPreGameAd in 2.0");
  926.          MochiAd.showPreGameAd(options);
  927.       }
  928.       
  929.       public static function showTimedAd(options:Object) : void
  930.       {
  931.          trace("[MochiAd] DEPRECATED: showTimedAd was renamed to showInterLevelAd in 2.0");
  932.          MochiAd.showInterLevelAd(options);
  933.       }
  934.       
  935.       public static function doOnEnterFrame(mc:MovieClip) : void
  936.       {
  937.          var f:Function = function(ev:Object):void
  938.          {
  939.             if("onEnterFrame" in mc && Boolean(mc.onEnterFrame))
  940.             {
  941.                mc.onEnterFrame();
  942.             }
  943.             else
  944.             {
  945.                ev.target.removeEventListener(ev.type,arguments.callee);
  946.             }
  947.          };
  948.          mc.addEventListener(Event.ENTER_FRAME,f);
  949.       }
  950.    }
  951. }
  952.